package com.lft.stack.calculator;

import java.util.Scanner;

/**
 * Function: 		ADD FUNCTION.
 * Reason:   		ADD REASON.
 * Date:            2020-10-12 10:16
 * <p>
 * Class Name:      Calculator
 * Package Name:    com.lft.stack.calculator
 * @author Laifengting / E-mail:laifengting@foxmail.com
 * @version 1.0.0
 * @since JDK 8
 */
public class Calculator {
	public static void main(String[] args) {
		// 创建两个栈，数栈和符号栈
		ArrayStack numStacks = new ArrayStack(10);
		ArrayStack operStacks = new ArrayStack(10);
		
		// 创建终端输入表达式。
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入整个表达式：");
		String expression = scanner.next().trim();
		
		// 定义需要的相关变量
		// 用于扫描
		int index = 0;
		int num1;
		int num2;
		int oper;
		int res;
		// 将每次扫描得到的 char 保存到 ch
		char ch;
		// 用于拼接多位数
		String keepNumber = "";
		
		while (true) {
			// 依次扫描得到表达式中的数字和操作符。
			ch = expression.substring(index, index + 1).charAt(0);
			// 如果是运算符
			if (operStacks.isOper(ch)) {
				// 判断当前的符号栈是否为空
				if (operStacks.isEmpty()) {
					// 符号栈为空，将当前符号压入栈中
					operStacks.push(ch);
				} else {
					// // 符号栈不为空，比较栈中的符号和当前符号的优先级。
					// 当前操作符的优先级小于或等于栈中操作符
					if (operStacks.priority(ch) <= operStacks.priority((char) operStacks.peek())) {
						num1 = numStacks.pop();
						num2 = numStacks.pop();
						oper = operStacks.pop();
						res = numStacks.calculate(num1, num2, (char) oper);
						// 将计算结果入栈
						numStacks.push(res);
						// 将当前操作符入栈
						operStacks.push(ch);
					} else {
						// 如果当前的操作符的优先级大于栈中操作符，就直接压入符号栈
						operStacks.push(ch);
					}
				}
			}
			// 如果不是运算符
			else {
				// numStacks.push(ch - 48);
				// 1. 处理多位数时，不能发现是一个数就立即入栈，因为他可能是多位数。
				// 2. 在处理数，需要向表达式的当前索引位置，再往后看一位，如果是数继续往后看，如果是符号才拼接入栈。
				// 3. 因此我们需要定义一个变量字符串，用于拼接。
				keepNumber += ch;
				// 如果 ch 已经是表达式的最后一位。也就直接入栈。
				if (index == expression.length() - 1) {
					// 如果后一位是运算符，则入栈
					numStacks.push(Integer.parseInt(keepNumber));
					// 重要的！！！！keepNumber 要置空。
					keepNumber = "";
				} else if (operStacks.isOper(expression.substring(index + 1, index + 2).charAt(0))) {
					// 如果后一位是运算符，则入栈
					numStacks.push(Integer.parseInt(keepNumber));
					// 重要的！！！！keepNumber 要置空。
					keepNumber = "";
				}
			}
			// // 判断 ch 是什么，然后做相应的处理
			if (++index >= expression.length()) {
				break;
			}
		}
		
		while (!operStacks.isEmpty()) {
			num1 = numStacks.pop();
			num2 = numStacks.pop();
			oper = operStacks.pop();
			res = numStacks.calculate(num1, num2, (char) oper);
			numStacks.push(res);
		}
		System.out.printf("表达式 %s 最后的结果为 %d", expression, numStacks.pop());
		
		scanner.close();
	}
}